gdk: remove the display->list_devices vfunc
authorPaolo Borelli <pborelli@gnome.org>
Mon, 29 Feb 2016 19:59:36 +0000 (20:59 +0100)
committerPaolo Borelli <pborelli@gnome.org>
Mon, 29 Feb 2016 20:53:58 +0000 (21:53 +0100)
gdk_display_list_devices is deprecated and all the backends
implement the same fallback by delegating to the device manager
and caching the list (caching it is needed since the method does
not transfer ownership of the container).
The compat code can be shared among all backends and we can
initialize the list lazily only in the case someone calls the
deprecated method.

https://bugzilla.gnome.org/show_bug.cgi?id=762891

gdk/broadway/gdkdisplay-broadway.c
gdk/broadway/gdkdisplay-broadway.h
gdk/gdkdisplay.c
gdk/gdkdisplayprivate.h
gdk/quartz/gdkdisplay-quartz.c
gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkdisplay-wayland.h
gdk/win32/gdkdisplay-win32.c
gdk/win32/gdkdisplay-win32.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkdisplay-x11.h

index c5f64286e2aa3c279e4bd1a5234612b87da2ecfe..2aa56c6a9d9dc78357272b1340d966b4371a7661 100644 (file)
@@ -66,42 +66,6 @@ gdk_event_init (GdkDisplay *display)
   broadway_display->event_source = _gdk_broadway_event_source_new (display);
 }
 
-static void
-gdk_broadway_display_init_input (GdkDisplay *display)
-{
-  GdkBroadwayDisplay *broadway_display;
-  GdkDeviceManager *device_manager;
-  GdkDevice *device;
-  GList *list, *l;
-
-  broadway_display = GDK_BROADWAY_DISPLAY (display);
-  G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
-  device_manager = gdk_display_get_device_manager (display);
-
-  /* For backwards compatibility, just add
-   * floating devices that are not keyboards.
-   */
-  list = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING);
-
-  for (l = list; l; l = l->next)
-    {
-      device = l->data;
-
-      if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
-        continue;
-
-      broadway_display->input_devices = g_list_prepend (broadway_display->input_devices,
-                                                   g_object_ref (l->data));
-    }
-
-  g_list_free (list);
-
-  /* Add the core pointer to the devices list */
-  broadway_display->input_devices = g_list_prepend (broadway_display->input_devices,
-                                                    g_object_ref (GDK_BROADWAY_DEVICE_MANAGER (device_manager)->core_pointer));
-  G_GNUC_END_IGNORE_DEPRECATIONS;
-}
-
 GdkDisplay *
 _gdk_broadway_display_open (const gchar *display_name)
 {
@@ -128,7 +92,6 @@ _gdk_broadway_display_open (const gchar *display_name)
 
   gdk_event_init (display);
 
-  gdk_broadway_display_init_input (display);
   _gdk_broadway_display_init_dnd (display);
 
   _gdk_broadway_screen_setup (broadway_display->screens[0]);
@@ -210,8 +173,6 @@ gdk_broadway_display_dispose (GObject *object)
 {
   GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (object);
 
-  g_list_foreach (broadway_display->input_devices, (GFunc) g_object_run_dispose, NULL);
-
   _gdk_screen_close (broadway_display->screens[0]);
 
   if (broadway_display->event_source)
@@ -235,8 +196,6 @@ gdk_broadway_display_finalize (GObject *object)
 
   _gdk_broadway_cursor_display_finalize (GDK_DISPLAY_OBJECT(broadway_display));
 
-  /* input GdkDevice list */
-  g_list_free_full (broadway_display->input_devices, g_object_unref);
   /* Free all GdkScreens */
   g_object_unref (broadway_display->screens[0]);
   g_free (broadway_display->screens);
@@ -297,14 +256,6 @@ gdk_broadway_display_supports_composite (GdkDisplay *display)
   return FALSE;
 }
 
-static GList *
-gdk_broadway_display_list_devices (GdkDisplay *display)
-{
-  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
-
-  return GDK_BROADWAY_DISPLAY (display)->input_devices;
-}
-
 static gulong
 gdk_broadway_display_get_next_serial (GdkDisplay *display)
 {
@@ -356,7 +307,6 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
   display_class->supports_shapes = gdk_broadway_display_supports_shapes;
   display_class->supports_input_shapes = gdk_broadway_display_supports_input_shapes;
   display_class->supports_composite = gdk_broadway_display_supports_composite;
-  display_class->list_devices = gdk_broadway_display_list_devices;
   display_class->get_cursor_for_type = _gdk_broadway_display_get_cursor_for_type;
   display_class->get_cursor_for_name = _gdk_broadway_display_get_cursor_for_name;
   display_class->get_cursor_for_surface = _gdk_broadway_display_get_cursor_for_surface;
index 401ac6fa9326d5c07bfe52bcff339e3b06be399f..fe2080ac70c4e5aa57729ed894f6685ae7e682de 100644 (file)
@@ -50,10 +50,6 @@ struct _GdkBroadwayDisplay
   /* drag and drop information */
   GdkDragContext *current_dest_drag;
 
-  /* Input device */
-  /* input GdkDevice list */
-  GList *input_devices;
-
   /* The offscreen window that has the pointer in it (if any) */
   GdkWindow *active_offscreen_window;
 
index f336c0e1674798b0029e73e2bc36ad7ab502ef4f..88586e5f49b3a8b97c721d7c9375908eb8cd137d 100644 (file)
@@ -293,6 +293,8 @@ gdk_display_dispose (GObject *object)
   display->queued_events = NULL;
   display->queued_tail = NULL;
 
+  g_list_foreach (display->input_devices, (GFunc) g_object_run_dispose, NULL);
+
   if (device_manager)
     {
       /* this is to make it drop devices which may require using the X
@@ -321,6 +323,8 @@ gdk_display_finalize (GObject *object)
   g_hash_table_destroy (display->pointers_info);
   g_hash_table_destroy (display->multiple_click_info);
 
+  g_list_free_full (display->input_devices, g_object_unref);
+
   if (display->device_manager)
     g_object_unref (display->device_manager);
 
@@ -1845,7 +1849,40 @@ gdk_display_list_devices (GdkDisplay *display)
 {
   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
 
-  return GDK_DISPLAY_GET_CLASS (display)->list_devices (display);
+  if (!display->input_devices)
+    {
+      GdkDeviceManager *device_manager;
+      GdkDevice *device;
+      GList *list, *l;
+
+      G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+      device_manager = gdk_display_get_device_manager (display);
+
+      /* For backwards compatibility, just add
+       * floating devices that are not keyboards.
+       */
+      list = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING);
+
+      for (l = list; l; l = l->next)
+        {
+          device = l->data;
+
+          if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
+            continue;
+
+          display->input_devices = g_list_prepend (display->input_devices, g_object_ref (l->data));
+        }
+
+      g_list_free (list);
+
+      G_GNUC_END_IGNORE_DEPRECATIONS;
+
+      /* Add the core pointer to the devices list */
+      device = gdk_seat_get_pointer (gdk_display_get_default_seat (display));
+      display->input_devices = g_list_prepend (display->input_devices, g_object_ref (device));
+    }
+
+  return display->input_devices;
 }
 
 static GdkAppLaunchContext *
index 6bdae091bf79e6d69fe01acab849fd12da36de83..1b174d54be5e11f25ebea72caf3d6b96bfed18a0 100644 (file)
@@ -111,6 +111,7 @@ struct _GdkDisplay
   GHashTable *device_grabs;
   GHashTable *motion_hint_info;
   GdkDeviceManager *device_manager;
+  GList *input_devices; /* Deprecated, only used to keep gdk_display_list_devices working */
 
   GHashTable *pointers_info;  /* GdkPointerWindowInfo for each device */
   guint32 last_event_time;    /* Last reported event time from server */
@@ -175,7 +176,6 @@ struct _GdkDisplayClass
                                                          gdouble          x,
                                                          gdouble          y);
 
-  GList *                    (*list_devices)       (GdkDisplay *display);
   GdkAppLaunchContext *      (*get_app_launch_context) (GdkDisplay *display);
 
   void                       (*before_process_all_updates) (GdkDisplay *display);
index 15b3f39222dc1dbd9825bb65239b47a07e5ceda9..2bea5705f914d6594ebc1f03e60e23fc8b04a2fb 100644 (file)
@@ -31,8 +31,6 @@
 struct _GdkQuartzDisplay
 {
   GdkDisplay display;
-
-  GList *input_devices;
 };
 
 struct _GdkQuartzDisplayClass
@@ -58,39 +56,6 @@ _gdk_device_manager_new (GdkDisplay *display)
                        NULL);
 }
 
-static void
-gdk_quartz_display_init_input (GdkDisplay *display)
-{
-  GdkQuartzDisplay *display_quartz;
-  GdkDeviceManager *device_manager;
-  GList *list, *l;
-
-  display_quartz = GDK_QUARTZ_DISPLAY (display);
-  device_manager = gdk_display_get_device_manager (_gdk_display);
-
-  /* For backwards compabitility, just add floating devices that are
-   * not keyboards.
-   */
-  list = gdk_device_manager_list_devices (device_manager,
-                                          GDK_DEVICE_TYPE_FLOATING);
-  for (l = list; l; l = l->next)
-    {
-      GdkDevice *device = l->data;
-
-      if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
-        continue;
-
-      display_quartz->input_devices = g_list_prepend (display_quartz->input_devices,
-                                                      g_object_ref (l->data));
-    }
-
-  g_list_free (list);
-
-  /* Add the core pointer to the devices list */
-  display_quartz->input_devices = g_list_prepend (display_quartz->input_devices,
-                                                  g_object_ref (GDK_QUARTZ_DEVICE_MANAGER_CORE (device_manager)->core_pointer));
-}
-
 GdkDisplay *
 _gdk_quartz_display_open (const gchar *display_name)
 {
@@ -110,8 +75,6 @@ _gdk_quartz_display_open (const gchar *display_name)
 
   _gdk_quartz_events_init ();
 
-  gdk_quartz_display_init_input (_gdk_display);
-
 #if 0
   /* FIXME: Remove the #if 0 when we have these functions */
   _gdk_quartz_dnd_init ();
@@ -220,14 +183,6 @@ gdk_quartz_display_supports_composite (GdkDisplay *display)
   return FALSE;
 }
 
-static GList *
-gdk_quartz_display_list_devices (GdkDisplay *display)
-{
-  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
-
-  return GDK_QUARTZ_DISPLAY (display)->input_devices;
-}
-
 static gulong
 gdk_quartz_display_get_next_serial (GdkDisplay *display)
 {
@@ -254,9 +209,6 @@ gdk_quartz_display_dispose (GObject *object)
 {
   GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object);
 
-  g_list_foreach (display_quartz->input_devices,
-                  (GFunc) g_object_run_dispose, NULL);
-
   G_OBJECT_CLASS (gdk_quartz_display_parent_class)->dispose (object);
 }
 
@@ -265,8 +217,6 @@ gdk_quartz_display_finalize (GObject *object)
 {
   GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object);
 
-  g_list_free_full (display_quartz->input_devices, g_object_unref);
-
   G_OBJECT_CLASS (gdk_quartz_display_parent_class)->finalize (object);
 }
 
@@ -296,7 +246,6 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class)
   display_class->supports_shapes = gdk_quartz_display_supports_shapes;
   display_class->supports_input_shapes = gdk_quartz_display_supports_input_shapes;
   display_class->supports_composite = gdk_quartz_display_supports_composite;
-  display_class->list_devices = gdk_quartz_display_list_devices;
   display_class->get_cursor_for_type = _gdk_quartz_display_get_cursor_for_type;
   display_class->get_cursor_for_name = _gdk_quartz_display_get_cursor_for_name;
   display_class->get_cursor_for_surface = _gdk_quartz_display_get_cursor_for_surface;
index 50043dcc176280f655b7acc8aa55586ee52560d7..c811f19d67ab40a334ded92ef3aa43860f6381a8 100644 (file)
@@ -105,18 +105,6 @@ _gdk_wayland_display_async_roundtrip (GdkWaylandDisplay *display_wayland)
     g_list_append (display_wayland->async_roundtrips, callback);
 }
 
-static void
-gdk_input_init (GdkDisplay *display)
-{
-  GdkWaylandDisplay *display_wayland;
-
-  display_wayland = GDK_WAYLAND_DISPLAY (display);
-
-  /* Add the core pointer to the devices list */
-  display_wayland->input_devices = g_list_prepend (display_wayland->input_devices,
-                                                   gdk_seat_get_pointer (gdk_display_get_default_seat (display)));
-}
-
 static void
 xdg_shell_ping (void             *data,
                 struct xdg_shell *xdg_shell,
@@ -463,8 +451,6 @@ _gdk_wayland_display_open (const gchar *display_name)
       return NULL;
     }
 
-  gdk_input_init (display);
-
   display_wayland->selection = gdk_wayland_selection_new ();
 
   g_signal_emit_by_name (display, "opened");
@@ -477,9 +463,6 @@ gdk_wayland_display_dispose (GObject *object)
 {
   GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (object);
 
-  g_list_foreach (display_wayland->input_devices,
-                 (GFunc) g_object_run_dispose, NULL);
-
   _gdk_screen_close (display_wayland->screen);
 
   if (display_wayland->event_source)
@@ -515,9 +498,6 @@ gdk_wayland_display_finalize (GObject *object)
 
   _gdk_wayland_display_finalize_cursors (display_wayland);
 
-  /* input GdkDevice list */
-  g_list_free_full (display_wayland->input_devices, g_object_unref);
-
   g_object_unref (display_wayland->screen);
 
   g_free (display_wayland->startup_notification_id);
@@ -652,14 +632,6 @@ gdk_wayland_display_supports_composite (GdkDisplay *display)
   return FALSE;
 }
 
-static GList *
-gdk_wayland_display_list_devices (GdkDisplay *display)
-{
-  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
-
-  return GDK_WAYLAND_DISPLAY (display)->input_devices;
-}
-
 static void
 gdk_wayland_display_before_process_all_updates (GdkDisplay *display)
 {
@@ -761,7 +733,6 @@ gdk_wayland_display_class_init (GdkWaylandDisplayClass *class)
   display_class->supports_shapes = gdk_wayland_display_supports_shapes;
   display_class->supports_input_shapes = gdk_wayland_display_supports_input_shapes;
   display_class->supports_composite = gdk_wayland_display_supports_composite;
-  display_class->list_devices = gdk_wayland_display_list_devices;
   display_class->get_app_launch_context = _gdk_wayland_display_get_app_launch_context;
   display_class->get_default_cursor_size = _gdk_wayland_display_get_default_cursor_size;
   display_class->get_maximal_cursor_size = _gdk_wayland_display_get_maximal_cursor_size;
index bb1019648db577f548cc16252f4b35e26dd9edf3..297150ecfcbaa08f2a78e77a8ee3e9808066378c 100644 (file)
@@ -54,9 +54,6 @@ struct _GdkWaylandDisplay
   GdkDisplay parent_instance;
   GdkScreen *screen;
 
-  /* input GdkDevice list */
-  GList *input_devices;
-
   /* Startup notification */
   gchar *startup_notification_id;
 
index 322b009d50522f33e645068c8fac7be67f103f07..25273b5b38736f1108b5c38da25299cdf7d1b4a9 100644 (file)
 
 static int debug_indent = 0;
 
-static GList *
-gdk_win32_display_list_devices (GdkDisplay *display)
-{
-  g_return_val_if_fail (display == gdk_display_get_default (), NULL);
-
-  return GDK_WIN32_DISPLAY (display)->input_devices;
-}
-
-static void
-_gdk_input_init (GdkDisplay *display)
-{
-  GdkDeviceManagerWin32 *device_manager;
-  GList *devices;
-
-  _gdk_input_ignore_core = FALSE;
-
-  device_manager = g_object_new (GDK_TYPE_DEVICE_MANAGER_WIN32,
-                                 "display", display,
-                                 NULL);
-  display->device_manager = GDK_DEVICE_MANAGER (device_manager);
-
-  devices = g_list_copy (device_manager->wintab_devices);
-  devices = g_list_prepend (devices, device_manager->core_pointer);
-
-  GDK_WIN32_DISPLAY (display)->input_devices = devices;
-}
-
 /**
  * gdk_win32_display_set_cursor_theme:
  * @display: (type GdkWin32Display): a #GdkDisplay
@@ -260,7 +233,13 @@ _gdk_win32_display_open (const gchar *display_name)
   win32_display->screen = g_object_new (GDK_TYPE_WIN32_SCREEN, NULL);
 
   _gdk_events_init ();
-  _gdk_input_init (_gdk_display);
+
+  _gdk_input_ignore_core = FALSE;
+
+  _gdk_display->device_manager = g_object_new (GDK_TYPE_DEVICE_MANAGER_WIN32,
+                                               "display", _gdk_display,
+                                               NULL);
+
   _gdk_dnd_init ();
 
   /* Precalculate display name */
@@ -648,8 +627,6 @@ gdk_win32_display_finalize (GObject *object)
 {
   GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (object);
 
-  g_list_free (display_win32->input_devices);
-
   _gdk_win32_display_finalize_cursors (display_win32);
   _gdk_win32_dnd_exit ();
 
@@ -717,7 +694,6 @@ gdk_win32_display_class_init (GdkWin32DisplayClass *klass)
   display_class->supports_input_shapes = gdk_win32_display_supports_input_shapes;
   display_class->supports_composite = gdk_win32_display_supports_composite;
 
-  display_class->list_devices = gdk_win32_display_list_devices;
   //? display_class->get_app_launch_context = _gdk_win32_display_get_app_launch_context;
   display_class->get_cursor_for_type = _gdk_win32_display_get_cursor_for_type;
   display_class->get_cursor_for_name = _gdk_win32_display_get_cursor_for_name;
index 8f3b48e4d25cdda6c8277fbf8c6401ecc56ff6ac..cbd4b5d7a67c10dddf17d65f65b76bb88dea5a41 100644 (file)
@@ -28,8 +28,6 @@ struct _GdkWin32Display
 
   GdkScreen *screen;
 
-  GList *input_devices;
-
   Win32CursorTheme *cursor_theme;
   gchar *cursor_theme_name;
   int cursor_theme_size;
index 484ce40f56fc2a6d6189a91800de0f82561ca89b..6804ed2006671bf3e548ad5f80c177c42639d9c5 100644 (file)
@@ -1337,42 +1337,6 @@ gdk_event_init (GdkDisplay *display)
   G_GNUC_END_IGNORE_DEPRECATIONS;
 }
 
-static void
-gdk_x11_display_init_input (GdkDisplay *display)
-{
-  GdkX11Display *display_x11;
-  GdkDeviceManager *device_manager;
-  GdkDevice *device;
-  GList *list, *l;
-
-  display_x11 = GDK_X11_DISPLAY (display);
-
-  G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
-  device_manager = gdk_display_get_device_manager (display);
-
-  /* For backwards compatibility, just add
-   * floating devices that are not keyboards.
-   */
-  list = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING);
-  G_GNUC_END_IGNORE_DEPRECATIONS;
-
-  for (l = list; l; l = l->next)
-    {
-      device = l->data;
-
-      if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
-        continue;
-
-      display_x11->input_devices = g_list_prepend (display_x11->input_devices,
-                                                   g_object_ref (l->data));
-    }
-
-  g_list_free (list);
-
-  display_x11->input_devices = g_list_prepend (display_x11->input_devices,
-                                               g_object_ref (gdk_seat_get_pointer (gdk_display_get_default_seat (display))));
-}
-
 static void
 set_sm_client_id (GdkDisplay  *display,
                   const gchar *sm_client_id)
@@ -1639,8 +1603,6 @@ _gdk_x11_display_open (const gchar *display_name)
   }
 #endif
 
-  gdk_x11_display_init_input (display);
-
   _gdk_x11_screen_setup (display_x11->screen);
 
   g_signal_emit_by_name (display, "opened");
@@ -1898,8 +1860,6 @@ gdk_x11_display_dispose (GObject *object)
 {
   GdkX11Display *display_x11 = GDK_X11_DISPLAY (object);
 
-  g_list_foreach (display_x11->input_devices, (GFunc) g_object_run_dispose, NULL);
-
   _gdk_screen_close (display_x11->screen);
 
   if (display_x11->event_source)
@@ -1936,9 +1896,6 @@ gdk_x11_display_finalize (GObject *object)
   /* List of event window extraction functions */
   g_slist_free_full (display_x11->event_types, g_free);
 
-  /* input GdkDevice list */
-  g_list_free_full (display_x11->input_devices, g_object_unref);
-
   /* input GdkWindow list */
   g_list_free_full (display_x11->input_windows, g_free);
 
@@ -2497,14 +2454,6 @@ gdk_x11_display_supports_composite (GdkDisplay *display)
         x11_display->have_xfixes;
 }
 
-static GList *
-gdk_x11_display_list_devices (GdkDisplay *display)
-{
-  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
-
-  return GDK_X11_DISPLAY (display)->input_devices;
-}
-
 /**
  * gdk_x11_register_standard_event_type:
  * @display: (type GdkX11Display): a #GdkDisplay
@@ -2981,7 +2930,6 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class)
   display_class->supports_shapes = gdk_x11_display_supports_shapes;
   display_class->supports_input_shapes = gdk_x11_display_supports_input_shapes;
   display_class->supports_composite = gdk_x11_display_supports_composite;
-  display_class->list_devices = gdk_x11_display_list_devices;
   display_class->get_app_launch_context = _gdk_x11_display_get_app_launch_context;
   display_class->get_cursor_for_type = _gdk_x11_display_get_cursor_for_type;
   display_class->get_cursor_for_name = _gdk_x11_display_get_cursor_for_name;
index 9b78f61d17cc544964786db768ebdd648bc679bd..004ee69ae33ad9d788ceaa0a124e28e849953c27 100644 (file)
@@ -97,10 +97,6 @@ struct _GdkX11Display
   /* translation queue */
   GQueue *translate_queue;
 
-  /* Input device */
-  /* input GdkDevice list */
-  GList *input_devices;
-
   /* input GdkWindow list */
   GList *input_windows;